package com.cwnu.sw.cys.core.websocket.service;

import cn.hutool.core.net.url.UrlBuilder;
import com.cwnu.sw.cys.core.common.utils.NettyUtil;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.codec.http.FullHttpRequest;
import org.apache.commons.lang3.StringUtils;

import java.net.InetSocketAddress;
import java.util.Optional;

/**
 * @author jisam
 * @version 1.0
 * @contact "jisamchan@outlook.com"
 * @date 22/03/2025
 * @description 使用url 传参数 ， 协议传参方法废弃
 */
public class MyHttpHeaderHandler extends ChannelInboundHandlerAdapter {
    /**
     * 处理接收到的通道数据事件
     * @param ctx 通道处理上下文，用于访问通道和事件流
     * @param msg 接收到的消息对象，类型为Object
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        if(msg instanceof FullHttpRequest){
            // 解析HTTP请求并处理URI参数
            FullHttpRequest req = (FullHttpRequest) msg;
            UrlBuilder urlBuilder =  UrlBuilder.ofHttp(req.uri());

            // 提取查询参数中的token值并设置到通道属性
            Optional<String> tokenOptional = Optional.of(urlBuilder)
                    .map(UrlBuilder::getQuery)
                    .map(urlQuery -> urlQuery.get("token"))
                    .map(CharSequence::toString);
            tokenOptional.ifPresent(s -> NettyUtil.setAttr(ctx.channel(), NettyUtil.TOKEN, s));

            // 重置请求URI为路径部分（去除查询参数）
            req.setUri(urlBuilder.getPath().toString());
            // 获取客户端IP地址
            String ip = req.headers().get("X-Real-IP");
            if(StringUtils.isBlank(ip))
            {
                InetSocketAddress inetSocketAddress = (InetSocketAddress) ctx.channel().remoteAddress();
                ip = inetSocketAddress.getAddress().getHostAddress();
            }
            // 设置客户端IP地址到通道属性
            NettyUtil.setAttr(ctx.channel(), NettyUtil.IP, ip);
            ctx.pipeline().remove(this);
        }
        // 继续传递事件到处理流水线的下一个环节
        ctx.fireChannelRead(msg);

    }

}
